﻿using System;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Collections.Generic;
using System.ComponentModel;

namespace EduFormManager.Models
{
        public class EduOrg : Entity
        {
            public EduOrg()
            {
                this.AccreditationDate = DateTime.Now;
                this.AccreditationFrom = String.Empty;
                this.AccreditationNum = "";
                //this.ActivityTypes = new HashedSet<ActivityType>();
                this.BranchCount = 0;
                this.Code = String.Empty;
                this.DirectorName = String.Empty;
                this.Email = String.Empty;
                this.FormData = new HashSet<EduFormData>();
                this.LicenseDate = DateTime.Now;
                this.LicenseFrom = String.Empty;
                this.LicenseNum = "";
                this.Link = String.Empty;
                this.ManagementAgencies = new HashSet<ManagementAgency>();
                this.ManagementAgencyActivities = new HashSet<ManagementAgencyActivity>();
                this.ManagementAgencyHasAuthority = false;
                this.Name = String.Empty;
                this.OKPOCode = String.Empty;
                this.Operator = String.Empty;
                this.Phone = string.Empty;
                this.PostAddress = String.Empty;
                this.ShortName = String.Empty;            
            }
            [Description("Наименование")]
            public virtual string Name { get; set; }
            [Description("Краткое наименование")]
            public virtual string ShortName { get; set; }
            [Description("Оператор")]
            public virtual string Operator { get; set; }
            [Description("Код")]
            public virtual string Code { get; set; }
            [Description("Код ОКПО")]
            public virtual string OKPOCode { get; set; }
            [Description("Дата выдачи лицензии")]
            public virtual DateTime LicenseDate { get; set; }
            
            public virtual DateTime LicenseEndDate { get; set; }
            [Description("Номер лицензии")]
            public virtual string LicenseNum { get; set; }
            [Description("Кем выдана лицензия")]
            public virtual string LicenseFrom { get; set; }
            [Description("Дата аккредитации")]
            public virtual DateTime AccreditationDate { get; set; }
            [Description("Аккредитация действительна до")]
            public virtual DateTime AccreditationEndDate { get; set; }
            [Description("Номер аккредитации")]
            public virtual string AccreditationNum { get; set; }
            [Description("Кем выдана аккредитация")]
            public virtual string AccreditationFrom { get; set; }
            [Description("Муниципалитет")]
            public virtual Municipality Municipality { get; set; }
            [Description("Органы государственно-общественного управления")]
            public virtual ISet<ManagementAgency> ManagementAgencies { get; set; }
            [Description("Виды деятельности органов государственно-общественного управления")]
            public virtual ISet<ManagementAgencyActivity> ManagementAgencyActivities { get; set; }
            public virtual ISet<EduFormData> FormData { get; set; }
            [Description("Вид")]
            public virtual EduOrgKind Kind { get; set; }
            [Description("Статус")]
            public virtual EduOrgStatus Status { get; set; }
            [Description("Тип")]
            public virtual EduOrgType Type { get; set; }
            [Description("Виды деятельности")]
            public virtual ISet<ActivityType> ActivityTypes { get; set; }
            [Description("Форма собственности")]
            public virtual OwnershipType OwnershipType { get; set; }
            [Description("Малокомплектное учреждение")]
            public virtual Boolean IsUngraded { get; set; }
            [Description("Директор")]
            public virtual string DirectorName { get; set; }
            [Description("Почтовый адрес")]
            public virtual string PostAddress { get; set; }
            [Description("Телефон")]
            public virtual string Phone { get; set; }
            [Description("Электронный почтовый адрес")]
            public virtual string Email { get; set; }
            [Description("Сайт в интернете")]
            public virtual string Link { get; set; }
            [Description("Количество филиалов")]
            public virtual int BranchCount { get; set; }
            [Description("Орган государственно-общественного управления обладает полномочиями...")]
            public virtual Boolean ManagementAgencyHasAuthority { get; set; }

            public virtual ISet<Log.Log> Logs { get; set; }
            public virtual ISet<Message> Messages { get; set; } 

            public virtual bool ContainsText(string text)
            {
                string queryText = text.Trim().ToLower();
                if (string.IsNullOrEmpty(queryText))
                    return true;
                string[] queryTextParts = queryText.Split(' ');
                PropertyInfo[] props = this.GetType().GetProperties();
                return props.Select(propertyInfo => propertyInfo.GetValue(this)).OfType<string>()
                    .Where(strValue => !string.IsNullOrEmpty(strValue))
                    .Any(strValue => queryTextParts.Any(query => strValue.Trim().ToLower().Contains(query)));
            }

            public new virtual string ToString()
            {
                return this.ShortName;
            }

            public virtual string ToStringFull()
            {
                StringBuilder stringBuilder = new StringBuilder();
                string[] nameParts = this.Name.Split(' ');
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Наименование", ""));
                for (int i = 0; i < nameParts.Length; i++)
                {
                    stringBuilder.Append(nameParts[i]).Append(" ");
                    if (i!= 0 && i%3 == 0)
                        stringBuilder.AppendLine(" ");
                }
                stringBuilder.AppendLine();
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Сокр. наименование", this.ShortName));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Номер аккредитации", this.AccreditationNum));
                stringBuilder.AppendLine(string.Format("• {0}: {1:dd MMMM yyyy}", "Дата", this.AccreditationDate));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Кем выдана", this.AccreditationFrom));

                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Номер лицензии", this.LicenseNum));
                stringBuilder.AppendLine(string.Format("• {0}: {1:dd MMMM yyyy}", "Дата", this.LicenseDate));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Кем выдана", this.LicenseFrom));

                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Вид учреждения", this.Kind));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Код ОКПО", this.OKPOCode));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Код учреждения", this.Code));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Телефон", this.Phone));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "e-mail", this.Email));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Сайт", this.Link));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Почта", this.PostAddress));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Статус", this.Status));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Тип", this.Type));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Директор", this.DirectorName));
                stringBuilder.AppendLine(string.Format("• {0}: {1}", "Число филиалов", this.BranchCount));

                return stringBuilder.ToString();
            }
        }
}
